import { fileURLToPath, URL } from 'node:url'
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueDevTools from 'vite-plugin-vue-devtools'

// https://vite.dev/config/
export default defineConfig({
  plugins: [
    vue({
      // 生产环境移除开发工具
      template: {
        compilerOptions: {
          // 移除生产环境的注释
          comments: false
        }
      }
    }),
    // 只在开发环境启用开发工具
    process.env.NODE_ENV === 'development' && vueDevTools(),
  ].filter(Boolean),

  base: './',

  resolve: {
    alias: {
      '@': fileURLToPath(new URL('./src', import.meta.url))
    },
  },

  // 构建优化配置
  build: {
    // 启用压缩
    minify: 'terser',

    // Terser 压缩选项
    terserOptions: {
      compress: {
        // 移除 console.log
        drop_console: true,
        // 移除 debugger
        drop_debugger: true,
        // 移除无用代码
        dead_code: true,
        // 移除未使用的变量
        unused: true,
      },
      mangle: {
        // 混淆变量名
        toplevel: true,
      },
    },

    // 代码分割配置
    rollupOptions: {
      output: {
        // 手动分割代码块
        manualChunks: {
          // Vue 核心库单独打包
          'vue-vendor': ['vue', 'vue-router'],
          // Element Plus 单独打包
          'element-vendor': ['element-plus', '@element-plus/icons-vue'],
        },

        // 文件命名规则
        chunkFileNames: 'js/[name]-[hash].js',
        entryFileNames: 'js/[name]-[hash].js',
        assetFileNames: (assetInfo) => {
          if (!assetInfo.name) return 'assets/[name]-[hash][extname]'

          const info = assetInfo.name.split('.')
          const ext = info[info.length - 1]
          if (/\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/i.test(assetInfo.name)) {
            return `media/[name]-[hash].${ext}`
          }
          if (/\.(png|jpe?g|gif|svg)(\?.*)?$/i.test(assetInfo.name)) {
            return `img/[name]-[hash].${ext}`
          }
          if (/\.(woff2?|eot|ttf|otf)(\?.*)?$/i.test(assetInfo.name)) {
            return `fonts/[name]-[hash].${ext}`
          }
          return `assets/[name]-[hash].${ext}`
        }
      },

      // 外部依赖配置（如果需要CDN）
      external: [],
    },

    // 设置打包大小警告阈值
    chunkSizeWarningLimit: 1000,

    // 启用 CSS 代码分割
    cssCodeSplit: true,

    // 生成 source map（生产环境可关闭）
    sourcemap: false,

    // 启用 gzip 压缩报告
    reportCompressedSize: true,
  },

  // CSS 优化
  css: {
    // CSS 压缩
    postcss: {
      plugins: [
        // 可以添加 autoprefixer 等插件
      ]
    }
  },

  // 开发服务器配置
  server: {
    port: 3000,
    open: true,
  },

  // 预构建优化
  optimizeDeps: {
    include: [
      'vue',
      'vue-router',
      'element-plus',
      '@element-plus/icons-vue'
    ],
    // 排除不需要预构建的依赖
    exclude: []
  }
})
